function ModelSettingJson() {
    this.NAME = 'name';
    this.ID = 'id';
    this.MODEL = 'model';
    this.TEXTURES = 'textures';
    this.HIT_AREAS = 'hit_areas';
    this.PHYSICS = 'physics';
    this.POSE = 'pose';
    this.EXPRESSIONS = 'expressions';
    this.MOTION_GROUPS = 'motions';
    this.SOUND = 'sound';
    this.FADE_IN = 'fade_in';
    this.FADE_OUT = 'fade_out';
    this.LAYOUT = 'layout';
    this.INIT_PARAM = 'init_param';
    this.INIT_PARTS_VISIBLE = 'init_parts_visible';
    this.VALUE = 'val';
    this.FILE = 'file';

    this.json = {};
}


ModelSettingJson.prototype.loadModelSetting = function(path, callback) {
var thisRef = this;
var pm = Live2DFramework.getPlatformManager();
pm.loadBytes(path, function(buf) {
    var str = String.fromCharCode.apply(null, new Uint8Array(buf));
    thisRef.json = JSON.parse(str);
    callback();
});
};


ModelSettingJson.prototype.getTextureFile = function(n) {
if (this.json[this.TEXTURES] == null || this.json[this.TEXTURES][n] == null)
    return null;

return this.json[this.TEXTURES][n];
}


ModelSettingJson.prototype.getModelFile = function() {
return this.json[this.MODEL];
};


ModelSettingJson.prototype.getTextureNum = function() {
if (this.json[this.TEXTURES] == null) return 0;

return this.json[this.TEXTURES].length;
}


ModelSettingJson.prototype.getHitAreaNum = function() {
if (this.json[this.HIT_AREAS] == null)
    return 0;

return this.json[this.HIT_AREAS].length;
}


ModelSettingJson.prototype.getHitAreaID = function(n) {
if (this.json[this.HIT_AREAS] == null ||
        this.json[this.HIT_AREAS][n] == null)
    return null;

return this.json[this.HIT_AREAS][n][this.ID];
}


ModelSettingJson.prototype.getHitAreaName = function(n) {
if (this.json[this.HIT_AREAS] == null ||
        this.json[this.HIT_AREAS][n] == null)
    return null;

return this.json[this.HIT_AREAS][n][this.NAME];
}


ModelSettingJson.prototype.getPhysicsFile = function() {
return this.json[this.PHYSICS];
}


ModelSettingJson.prototype.getPoseFile = function() {
return this.json[this.POSE];
}


ModelSettingJson.prototype.getExpressionNum = function() {
return (this.json[this.EXPRESSIONS] == null) ? 0 : this.json[this.EXPRESSIONS].length;
}


ModelSettingJson.prototype.getExpressionFile = function(n) {
if (this.json[this.EXPRESSIONS] == null)
    return null;
return this.json[this.EXPRESSIONS][n][this.FILE];
}


ModelSettingJson.prototype.getExpressionName = function(n) {
if (this.json[this.EXPRESSIONS] == null)
    return null;
return this.json[this.EXPRESSIONS][n][this.NAME];
}


ModelSettingJson.prototype.getLayout = function() {
return this.json[this.LAYOUT];
}


ModelSettingJson.prototype.getInitParamNum = function() {
return (this.json[this.INIT_PARAM] == null) ? 0 : this.json[this.INIT_PARAM].length;
}


ModelSettingJson.prototype.getMotionNum = function(name) {
if (this.json[this.MOTION_GROUPS] == null ||
        this.json[this.MOTION_GROUPS][name] == null)
    return 0;

return this.json[this.MOTION_GROUPS][name].length;
}


ModelSettingJson.prototype.getMotionFile = function(name, n) {
if (this.json[this.MOTION_GROUPS] == null ||
        this.json[this.MOTION_GROUPS][name] == null ||
        this.json[this.MOTION_GROUPS][name][n] == null)
    return null;

return this.json[this.MOTION_GROUPS][name][n][this.FILE];
}


ModelSettingJson.prototype.getMotionSound = function(name, n) {
if (this.json[this.MOTION_GROUPS] == null ||
        this.json[this.MOTION_GROUPS][name] == null ||
        this.json[this.MOTION_GROUPS][name][n] == null ||
        this.json[this.MOTION_GROUPS][name][n][this.SOUND] == null)
    return null;

return this.json[this.MOTION_GROUPS][name][n][this.SOUND];
}


ModelSettingJson.prototype.getMotionFadeIn = function(name, n) {
if (this.json[this.MOTION_GROUPS] == null ||
        this.json[this.MOTION_GROUPS][name] == null ||
        this.json[this.MOTION_GROUPS][name][n] == null ||
        this.json[this.MOTION_GROUPS][name][n][this.FADE_IN] == null)
    return 1000;

return this.json[this.MOTION_GROUPS][name][n][this.FADE_IN];
}


ModelSettingJson.prototype.getMotionFadeOut = function(name, n) {
if (this.json[this.MOTION_GROUPS] == null ||
        this.json[this.MOTION_GROUPS][name] == null ||
        this.json[this.MOTION_GROUPS][name][n] == null ||
        this.json[this.MOTION_GROUPS][name][n][this.FADE_OUT] == null)
    return 1000;

return this.json[this.MOTION_GROUPS][name][n][this.FADE_OUT];
}


ModelSettingJson.prototype.getInitParamID = function(n) {
if (this.json[this.INIT_PARAM] == null ||
        this.json[this.INIT_PARAM][n] == null)
    return null;

return this.json[this.INIT_PARAM][n][this.ID];
}


ModelSettingJson.prototype.getInitParamValue = function(n) {
if (this.json[this.INIT_PARAM] == null || this.json[this.INIT_PARAM][n] == null)
    return NaN;

return this.json[this.INIT_PARAM][n][this.VALUE];
}


ModelSettingJson.prototype.getInitPartsVisibleNum = function() {
return (this.json[this.INIT_PARTS_VISIBLE] == null) ? 0 : this.json[this.INIT_PARTS_VISIBLE].length;
}


ModelSettingJson.prototype.getInitPartsVisibleID = function(n) {
if (this.json[this.INIT_PARTS_VISIBLE] == null || this.json[this.INIT_PARTS_VISIBLE][n] == null)
    return null;
return this.json[this.INIT_PARTS_VISIBLE][n][this.ID];
}


ModelSettingJson.prototype.getInitPartsVisibleValue = function(n) {
if (this.json[this.INIT_PARTS_VISIBLE] == null || this.json[this.INIT_PARTS_VISIBLE][n] == null)
    return NaN;

return this.json[this.INIT_PARTS_VISIBLE][n][this.VALUE];
}
